#include "c_stack.h"

Stack* ConstructStack(StackType type)
{
    Stack* stk = (Stack*)malloc(sizeof(Stack));
    stk->type = type;
    stk->stack = stk->type == StackType::ArrayStack ? 
    (void*)ConstructArray(10) : (void*)ConstructList();
    return stk;
}

void DestructStack(Stack* stk)
{
    if(!stk) return ;
    if(stk->type == StackType::ArrayStack)
    {
        DestructArray((Array*)stk->stack);
    }
    else
    {
        DestructList((List*)stk->stack);
    }
    stk->stack = NULL;
    free(stk);
    stk = NULL;
}

void Push(Stack* stk,void* data)
{
    if(!stk || !data) return ;
    if(stk->type == StackType::ArrayStack)
    {
        PushBack((Array*)stk->stack,data);     
    }
    else
    {
        PushBack((List*)stk->stack,data);        
    }
}

void Pop(Stack* stk)
{
    if(!stk) return ;
    if(stk->type == StackType::ArrayStack)
    {
        PopBack((Array*)stk->stack);
    }
    else
    {
        PopBack((List*)stk->stack);
    }
}

void* Top(Stack* stk)
{
    if(!stk) return NULL;
    return stk->type == StackType::ArrayStack ? 
            Back((Array*)stk->stack) : Back((List*)stk->stack);
}

bool Empty(Stack* stk)
{
    if(!stk) return true;
    return stk->type == StackType::ArrayStack ? 
            Empty((Array*)stk->stack) : Empty((List*)stk->stack);
}

unsigned int Length(Stack* stk)
{
    if(!stk) return 0;
    return stk->type == StackType::ArrayStack ? 
            Length((Array*)stk->stack) : Length((List*)stk->stack);
}

void Clear(Stack* stk)
{
    if(!stk) return ;
    return stk->type == StackType::ArrayStack ? 
            Clear((Array*)stk->stack) : Clear((List*)stk->stack);
}
